iOS 使用AFNetworking传输字符串

通常网络请求使用AFNetworking我们都会将字典作为参数传给服务端,如果应用对数据的安全级别要求较高,这时肯定会将参数加密后再传输,那么上传的参数就变成一串看不懂的字符串,我们只需要设置AFHTTPSessionManager中几个类型即可直接上传字符。

配置参数请求和接收类型

1
2
3
4
5
6
7
8
9
10
+ (AFHTTPSessionManager *)getRequstManager {
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.requestSerializer.timeoutInterval = 30;
manager.requestSerializer.stringEncoding = NSUTF8StringEncoding;
manager.requestSerializer = [AFHTTPRequestSerializer serializer];
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Accept"];
[manager.requestSerializer setValue:@"text/html" forHTTPHeaderField:@"Content-Type"];
return manager;
}

配置完成后发送请求,可能会发现服务端接收的字符串前面莫名的多出’=’符号,查看源码发现AFURLRequestSerialization文件中下面的方法引起的

1
2
3
4
5
6
7
- (NSString *)URLEncodedStringValue {
if (!self.value || [self.value isEqual:[NSNull null]]) {
return AFPercentEscapedStringFromString([self.field description]);
} else {
return [NSString stringWithFormat:@"%@=%@", AFPercentEscapedStringFromString([self.field description]), AFPercentEscapedStringFromString([self.value description])];
}
}

顺藤摸瓜发现AFQueryStringFromParameters函数中使用到了- URLEncodedStringValue方法。发现如下代码使用到了AFQueryStringFromParameters函数,如果实现self.queryStringSerialization属性就可以解决’=’问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if (self.queryStringSerialization) {
NSError *serializationError;
query = self.queryStringSerialization(request, parameters, &serializationError);
if (serializationError) {
if (error) {
*error = serializationError;
}
return nil;
}
} else {
switch (self.queryStringSerializationStyle) {
case AFHTTPRequestQueryStringDefaultStyle:
query = AFQueryStringFromParameters(parameters);
break;
}
}

解决’=’方法

1
2
3
4
5
6
7
8
9
10
11
AFHTTPSessionManager *manager = [self sessionManager];
[manager.requestSerializer setQueryStringSerializationWithBlock:^NSString *(NSURLRequest *request, NSDictionary *parameters, NSError *__autoreleasing *error) {
return paramsStr;
}];
[manager POST:urlStr parameters:paramsStr progress:^(NSProgress * _Nonnull uploadProgress) {
} success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
}];

总结

  • 不建议修改直接源码达到去掉’=’目的,通常可能因为源码版本更新而遗忘。
  • 如果使用原生网络请求可以直接通过[request setHTTPBody:data]来实现字符串或其他数据传输。